package org.apache.commons.pool2;

import java.io.PrintWriter;
import java.util.Deque;

/**
 * 类的描述
 *
 * @author ztkool
 * @version v
 */
public interface PooledObject<T> extends Comparable<PooledObject<T>> {

    /**
     * 获取基础对象
     *
     * @return
     */
    T getObject();

    /**
     * 获取创建时间
     *
     * @return
     */
    long getCreateTime();

    /**
     * 获取此对象上一次处于活动状态的时间（毫秒）（在这种情况下，后续调用将返回一个增加的值）
     *
     * @return
     */
    long getActiveTimeMillis();

    /**
     * 获取此对象上一次在空闲状态下花费的时间（毫秒）（在这种情况下，后续调用将返回一个增加的值）。
     *
     * @return
     */
    long getIdleTimeMillis();

    /**
     * 获取上次调用包装对象的时间。
     *
     * @return
     */
    long getLastBorrowTime();

    /**
     * 获取上次返回包装对象的时间。
     *
     * @return
     */
    long getLastReturnTime();

    /**
     * 返回上次使用此对象的时间。
     *
     * @return
     */
    long getLastUsedTime();

    /**
     * 基于空闲时间（即实例返回池后的时间长度）对实例进行排序。由GKOP空闲对象逐出器使用。
     *
     * @param pooledObject
     * @return
     */
    @Override
    int compareTo(PooledObject<T> pooledObject);

    @Override
    boolean equals(Object object);

    @Override
    int hashCode();

    @Override
    String toString();

    /**
     * 尝试将池对象置于逐出状态
     *
     * @return
     */
    boolean startEvictionTest();

    /**
     * 调用以通知对象逐出测试已结束。
     *
     * @param pooledObjects
     * @return
     */
    boolean endEvictionTest(Deque<PooledObject<T>> pooledObjects);

    /**
     * 分配对象。
     *
     * @return
     */
    boolean allocate();

    /**
     * 取消分配对象并将其设置为空闲（如果当前已分配）
     *
     * @return
     */
    boolean deallocate();

    /**
     * 将状态设置为无效
     */
    void invalidate();

    /**
     * 是否正在使用废弃的目标跟踪？如果这是真的，则实现将需要记录借用此对象的最后一个调用方的堆栈跟踪。
     *
     * @param logAbandoned
     */
    void setLogAbandoned(boolean logAbandoned);

    /**
     * 记录上次使用对象时的当前堆栈跟踪。
     */
    void use();

    /**
     * 将借用此池对象的代码的堆栈跟踪和最后一个使用此对象的代码的堆栈跟踪（如果可用）打印到提供的编写器。
     *
     * @param printWriter
     */
    void printStackTrace(PrintWriter printWriter);

    /**
     * 返回此对象的状态。
     *
     * @return
     */
    PooledObjectState getState();

    /**
     * 将池对象标记为已放弃。
     */
    void markAbandoned();

    /**
     * 将对象标记为返回池。
     */
    void markReturning();
}
